package router;

import java.util.HashMap;

/**
 * 
 * Classe que representa a tabela de um roteador, contendo seus custos..
 * 
 * @author Arinaldo
 * @author Ana Gabrielle
 * @author Romeryto
 * 
 */
public class RouteTable {
	private static int INFINITY = 999;
	//<Id, custo>
	private HashMap<String, Integer> links;
	//<Destino, porQuemEuChegoAtehEleComMenorCusto>
	//<Id, by>
	private HashMap<String, String> routes;
	private int size = 0; //the size of this table;
	private String routerId = ""; //the router that this table belongs to;
	
	/**
	 * Cria uma tabela de custos
	 * @param routerId o ID do roteador ao qual pertence esta tabela
	 * @param size o tamanho da tabela
	 */
	public RouteTable(String routerId, int size) {
		links = new HashMap<String, Integer>();
		this.routerId = routerId;
		this.size = size;
		routes = new HashMap<String, String>();
		links.put(this.routerId, new Integer(0));
		routes.put(this.routerId, this.routerId); //o menor destino deste roteador ateh ele mesmo eh dado por ele.
		this.completeTable();
	}
	
	/**
	 * Preenche a tabela
	 *
	 */
	private void completeTable() {
		for (int i = 1; i < this.size+1; i++) {
			if(!(Integer.toString(i).equalsIgnoreCase(this.routerId))) {
				links.put(Integer.toString(i), new Integer(INFINITY));
			}
		}
		
	}

	/**
	 * Seta a distancia at� um dado roteador
	 * @param routerId o ID do roteador destino
	 * @param distance a distancia ate ele
	 */
	public void setDistanceTo(String routerId, Integer distance) {
		links.put(routerId, distance);
	}
	
	/**
	 * Retorna a distancia ate um dado roteador
	 * @param routerId
	 * @return
	 */
	public Integer getDistanceTo(String routerId) {
		return links.get(routerId);
	}
	
	/**
	 * Imprime a tabela, no formato: ID do roteador seguido da tabela com os custos
	 */
	public String toString() {
		String result = "Router's "+routerId+" table:\n";
		for (int i = 1; i < this.size+1; i++) {
			result += " > " + Integer.toString(i) + 
			" [" + links.get(Integer.toString(i)).toString() +"]"+ " - "+routes.get(Integer.toString(i))+"\n";
		}
		return result;
		
	}

	/**
	 * Retorna a tabela no formato String
	 * @return a tabela no formato String
	 */
	public String asString() {
		String result = "";
		for (int i = 1; i < this.size+1; i++) {
			result += links.get(Integer.toString(i)).toString() +" ";
		}
		return result.trim();
	}
	
	public void updateRoute(String routerId, String routerIdBy) {
		routes.put(routerId, routerIdBy);
	}
	
	public String getRoute() {
		return routes.get(this.routerId);
	}
}
